/**
WOP_Entry
定義所有WOP中Entry的基本attribute

賴念煒 -06/12/11 新增檔案。

06/12/19
比規格書新增getParent();  isTop();

06/12/21
和老師討論後，開始實作getActualPath();
以取得該變數在Debuger的絕對位址。
又為了ActualPath的正確性，必須確保其上層的資料為正確的，所以我們同時也製作update();
比方說，雖然有個叫p的Ref目前目標是我，我仍要要求他先更新，以保證他現在目標仍然是我。


//突然想到可怕的問題...update要是不但數值，連型態都換了怎麼辦？

想WOP_Entry改為private constructor，因為不能像JAVA的abstract class

12/21
	virtual string getActualPath();
	//作出對應JDB的真實位址
	
	假定本Entry為b，是Obj_Entry A@FF1234 的子元素。而我們詢問WOPM誰的Value指向A@FF1234，假定取得Ref_Entry p
	(當然，可能不只一個Ref_Entry符合，但對我們來說哪個都無所謂。)
	於是展轉取得 "p.b"
	WOPM這邊會實作適用於一般primitived type的method，比較例外的Obj_Entry即Ref_Entry則需覆寫。
	一開始很順利，但是遇到可能會有a.b.a.b... 的問題(網路節點問題)

12/22
	大幅修改 getActualPath()，詳情請見WOPM.h WOP_Obj_Entry.h

12/23
	完成method說明

2007/06/02 - 加入design doc 中的 vm的相關設計 - 新增了屬性 vm, method getVM(), setVM();

**/

#ifndef _WOP_Entry_H_
#define	_WOP_Entry_H_
/*------------------------------------------------------------*/
#include <string>
#include <cassert>
#include <vector>
//#include "src/MappingTree.h"
// for string convert into any type
#include <sstream>
#include <iostream>
#include "DIVA_VM.h"


//#include "MappingEngine.h"

class xMappingTree;

class WOP_Entry{

protected:
	WOP_Entry(){}
	string _name;	//變數名稱?
	string _value; 	//變數內容
	string _addr ;  //The address of the variable
	string _vartype;  // the string of type of the variable
	                  // for example, if it is an int pointer, the string is int*
	                  // if it is an object A, the string is A
	                  // if it is an pointer to object, the string is A*
	                  // if it is a pointer of pointer to object A, the string is A**
	                  // if it is a pointer to an array A, the string can be A[][]

	bool _top;   	//if top == true,the entry is added by user.else,is unfolded by an Object_Entry
	                //top其實可以經由「有沒有Obj_entry _parent」而判斷。
	bool _updated;	// this is a flag to be used by the command agent when updated all
	bool _changed ; // if the value is changed 
	bool _inscope ; // When a wop A is unfolded from a wop B, but after a while, wop B no longer have pointer 
	                                // pointing to wop A. In this case, wop A will enter hibernate mode
	                                // it will not be deleted from WOPM. It will sit there waiting for future pointer to point to it

	WOP_Entry* _parent; // if an wop is an object or array, this pointer points to its heap_object that contains this wop
	WOP_Entry* _from ;  // which WOP_Entry this is unfolded from
	WOP_Entry* _descentfrom ; // a wop A can be unfolded from a wop B and a wop B can be unfolded from C
	                                                    // and C is visualized directly by user.  In this case, wop A's _descentfrom is C



	virtual void init(string s,WOP_Entry* parent);

	/// 此wop entry 相對應的vm，預設為null - add by Mike Chiu according to design doc v0.51
	// DIVA_VM* VM;
	

public:
	virtual ~WOP_Entry() {}
	
	virtual string* getValAddr() { return &_value; }

	virtual void setVal(string s) { _value = s ; }
	//不得已只好都做成String，因為setVal還可以overload,get可不行。
	virtual string getVal() { return _value ; }

	virtual string getAddr() { return _addr ; }
	virtual void setAddr(string s) { _addr = s ; }

	virtual string getVarType() { return _vartype ; }
	virtual void setVarType(string s) { _vartype = s; }
	
	virtual void setName(string name) { _name = name ; }
	virtual string getName();  // the _name my appear in the form x.y.z This method will only return z
	virtual string getLongName(); // return the whole name
	virtual string *getNamePtr();

	virtual void setFrom(WOP_Entry *s) { 
		_from = s ; 
		}
	virtual WOP_Entry* getFrom() { return _from ; }

	virtual void setDescentFrom(WOP_Entry * from) ;
	virtual WOP_Entry* getDescentFrom() { return _descentfrom ; }

	virtual string getActualPath();
	//計算現在本Entry在Debuger上對應的Path
	//例如，雖然我是個Int_Entry x，但是我在JDB上的目前名稱可能不是x，而是p.a.x；	
	virtual string getActualPath(string s){
		//因為當要計算位址時，可能因為parent的不同而加入不同的符號，例如 "." 跟 "[""]" 這就是用來輔助製造path的。
		//當然，其實他是專屬 _parent(WOP_Heap_Entry)幫自己child算路徑的函式，只是為了程式結構，我們依舊把它放到最上層。
		//否則WOP_Entry必須認識自己的孫子，會有交互include的問題。
		//雖然可以用Name Space解決，但是據說更換環境會有驚喜...
		assert(false);
		return "";
	}
	virtual string getTypeStr() = 0 ; // this should be overridden by subtypes to return a string of its type
	virtual void setTop(bool t) { _top = t ; }
	virtual bool isTop();	

	virtual bool isUpdated();
	virtual void setUpdated(bool t);

	virtual bool isChanged() { return _changed ; }
	virtual void setChanged(bool t) { _changed = t ; }

	virtual bool getScope() { return _inscope ; }
	virtual void setScope(bool t) { _inscope = t ; }

	virtual WOP_Entry* getParent();
	//return parent,null if no parent.
	virtual void unfold();
	//展開被指到的元素。僅Ref_entry有用。其餘皆為空方法。

	virtual bool update()=0; // all the subclasses should override this method


	virtual void check_scope() ;

	virtual void updateRealValue(string s)=0 ;
	//要求更新。
	virtual void addChild(WOP_Entry* en){
		assert(false);
	}

	virtual WOP_Entry *findMatchedWOP(string vartype, string shortname) ;
	

	/** return the sub element pointer of this wop_entry 
	     @note the subclass such as WOP_Object and WOP_array should override this method */
	virtual  std::vector<WOP_Entry *>* getChildsPtr() { 
		assert(false);  
		return NULL ;
	}

	/// 取得此entry對應的vm 
	// By YPC 0825, this method is deprecated and should not be used
	// please query mappingengine instead
	// virtual DIVA_VM* getVM(){ return VM;}
	/// setVM - overwrite by each entry inhiretent this.

	/** setVM is called by commmand agent when a new wop entry is created
	    the setVM typically invoke a mapping GUI dialog which return a mapping tree
	*/

	std::pair< WOP_Entry*, xMappingTree* > setupVM();				// new version, using Qt framework

	/** Return a map<string var_name, string type>.
	 This method should be overridden by the child class. */
	virtual std::map<std::string, std::string> getVarTypeMap() { 
		assert(false);  // the subclass should override this method. There are misses if this method is called. 
		map<std::string, std::string> temp ;
		return temp ;
	}  

	/// ==================  template from_string ====================== 
	/// function for converting c++ string to any type user gives
	/// ===============================================================
	template <class T>
    bool from_string(T& t, const std::string& s, std::ios_base& (*f)(std::ios_base&))
    {
		std::istringstream iss(s);
		return !(iss >> f >> t).fail();
	}

};
/*------------------------------------------------------------*/
#endif	//#ifndef _WOP_Entry_H_
